VPS Docker 部署完整指南
基于 NAT VPS 的全 Docker 化部署方案 - 稳定、易迁移、可备份
服务器配置
硬件资源
- 内存: 4GB (当前仅用 175MB,资源充足)
- 架构: x86_64 (兼容性极佳)
- 系统: Ubuntu 22.04 LTS
配置远超"中转站"需求,完全可以作为轻量级云端应用中心
核心理念
为什么选择 Docker 化?
- 方便迁移: 所有配置都在文件夹里,打包即可换服务器
- 环境隔离: 不污染系统,不会依赖冲突
- 快速恢复: 备份 + 一行命令 = 原地复活
- 资源高效: 容器共享内核,比虚拟机轻量
NAT VPS 生存法则
- 数据挂载: 必须把数据目录挂载到宿主机
- 自动备份: 定期备份到云盘,防止商家跑路
- 避免高带宽应用: 不跑影视库、大流量下载器
基础环境搭建
1. 换源并安装 Docker
# 换源 (一路回车)
bash <(curl -sSL https://linuxmirrors.cn/main.sh) --source aliyun
# 强制改成阿里云源
cat > /etc/apt/sources.list <<EOF
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF
# 修复 DNS
echo "nameserver 223.5.5.5" > /etc/resolv.conf
echo "nameserver 1.1.1.1" >> /etc/resolv.conf
# 测试网络
ping -c 3 archive.ubuntu.com
# 更新软件源
apt update
# 安装 Docker
apt install -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 验证安装
docker --version
docker compose version
# 启动并设置开机自启
systemctl start docker
systemctl enable docker
2. 配置 Docker 镜像加速
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.1panel.live",
"https://docker.m.daocloud.io",
"https://docker.fxxk.dedyn.io",
"https://huecker.io"
]
}
EOF
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
3. 创建数据目录
mkdir -p /opt/docker_data
mkdir -p /opt/dockge
cd /opt/dockge
Cloudflare Tunnel 看门狗
为什么需要看门狗?
Cloudflare Tunnel 可能会因为网络波动、VPS 重启等原因断开连接,导致所有服务无法访问。看门狗机制会每 5 分钟自动检测隧道状态,发现异常时自动重启服务。
1. 创建看门狗脚本
nano /opt/check_tunnel.sh
写入内容:
#!/bin/bash
# ================= 配置 =================
# 填一个你比较稳定的服务地址(用来测试通不通)
# 建议用 note 或者 docker,因为它们响应快
TEST_URL="https://note.hxnppll.top"
# 日志文件路径
LOG_FILE="/var/log/tunnel_watchdog.log"
# =======================================
# 获取当前时间
NOW=$(date +"%Y-%m-%d %H:%M:%S")
# 发送请求检测
# -s: 静默模式
# -o /dev/null: 不输出内容
# -w "%{http_code}": 只输出状态码
# --max-time 10: 超过10秒没反应就算死
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$TEST_URL")
# 判断逻辑
# 000 = 无法连接 / DNS解析失败 / 超时
# 502 = Cloudflare 连不上 VPS (Bad Gateway)
# 503 = 服务不可用
# 530 = Origin DNS Error
if [ "$HTTP_CODE" == "000" ] || [ "$HTTP_CODE" == "502" ] || [ "$HTTP_CODE" == "503" ] || [ "$HTTP_CODE" == "530" ]; then
echo "[$NOW] ⚠️ 检测到故障 (状态码: $HTTP_CODE),正在重启 cloudflared..." >> $LOG_FILE
# 重启服务
systemctl restart cloudflared
# 等待 10 秒再次检查
sleep 10
NEW_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$TEST_URL")
echo "[$NOW] ✅ 重启完成,当前状态码: $NEW_CODE" >> $LOG_FILE
else
# 正常情况下不写日志,以免撑爆硬盘
:
fi
2. 赋予执行权限
chmod +x /opt/check_tunnel.sh
3. 手动测试
/opt/check_tunnel.sh
- 无输出: 网站正常运行
- 有输出: 脚本正在尝试重启服务
4. 加入定时任务
每 5 分钟自动检查一次:
crontab -e
在文件最后添加:
*/5 * * * * /opt/check_tunnel.sh
保存退出 (Ctrl+X → Y → Enter)
5. 查看日志
查看看门狗的工作记录:
cat /var/log/tunnel_watchdog.log
效果: 当网站无法访问时,最多等待 5 分钟,看门狗会自动重启 Cloudflare Tunnel 服务
三件套部署
「三件套」即 极简三剑客 篇的三位主角(Dockge + FileBrowser + Uptime Kuma),本节为部署完成后的汇总参考版;当时的逐步实操记录见三剑客篇。
1. Dockge (容器管理)
特点: 将 docker-compose.yml 可视化,方便管理和迁移
cd /opt/dockge
# 下载配置
curl -L https://ghproxy.net/https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml
# 启动
docker compose up -d
Cloudflare Tunnel 配置:
- Subdomain:
docker - URL:
10.10.10.1:5001 - 访问:
https://docker.hxnppll.top
登录信息:
- 账号: wei
- 密码: zw200495
2. FileBrowser (文件管理)
特点: Web 端管理 VPS 所有文件,支持上传/下载/编辑
在 Dockge 中新建 Stack,Name: filebrowser
version: '3.3'
services:
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
user: 0:0 # root权限
ports:
- 8081:80
volumes:
- /:/srv # 挂载整个根目录
- /opt/docker_data/filebrowser/filebrowser.db:/database.db
- /opt/docker_data/filebrowser/settings.json:/.filebrowser.json
restart: unless-stopped
Cloudflare Tunnel 配置:
- Subdomain:
file - URL:
10.10.10.1:8081 - 访问:
https://file.hxnppll.top
初始密码:
docker logs filebrowser # 查看初始密码
修改为: zw200495200495
3. Uptime Kuma (系统监控)
特点: 监控服务存活状态,SSL 证书过期提醒
在 Dockge 中新建 Stack,Name: uptime-kuma
version: '3.3'
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
volumes:
- /opt/docker_data/uptime-kuma:/app/data
- /var/run/docker.sock:/var/run/docker.sock # 监控容器状态
ports:
- 3001:3001
restart: always
Cloudflare Tunnel 配置:
- Subdomain:
status - URL:
localhost:3001 - 访问:
https://status.hxnppll.top
登录信息:
- 账号: wei
- 密码: zw200495
备份与恢复
备份架构
每天 21:00 自动执行
↓
打包 /opt/stacks + /opt/dockge + /opt/docker_data
↓
通过 Rclone 同步到家庭 Alist
↓
清理 7 天前的旧备份
1. 部署 Rclone
在 Dockge 中新建 Stack,Name: rclone-backup
version: '3.8'
services:
rclone:
image: rclone/rclone:latest
container_name: rclone
restart: unless-stopped
volumes:
- /opt/docker_data/rclone/config:/config/rclone
- /opt/backup:/data/backup
environment:
- PHP_TZ=Asia/Shanghai
- PUID=0
- PGID=0
command: rcd --rc-web-gui --rc-addr :5572 --rc-user admin --rc-pass admin
ports:
- 5572:5572
2. 配置 Rclone (连接家庭 Alist)
# 进入容器配置
docker exec -it rclone rclone config
# 交互配置步骤
n # 新建
home_alist # 名称
webdav # 类型
http://10.10.10.2:5244/dav # URL (EasyTier内网)
other # Vendor
[输入Alist用户名] # User
y → [输入密码] # Password
n # 跳过高级配置
y # 确认
q # 退出
# 验证连接
docker exec rclone rclone lsd home_alist:/
3. 创建备份脚本
nano /opt/backup_docker.sh
写入内容:
#!/bin/bash
# 配置区
BACKUP_DIR="/opt/backup"
DATE=$(date +%Y%m%d)
FILENAME="docker_backup_$DATE.tar.gz"
RCLONE_REMOTE="home_alist"
REMOTE_DIR="/D:/vps_backup"
# 准备目录
mkdir -p $BACKUP_DIR
echo "[$(date)] 开始备份..."
# 打包核心数据
echo "[$(date)] 正在打包文件..."
tar -czf $BACKUP_DIR/$FILENAME /opt/stacks /opt/dockge /opt/docker_data
# 检查打包结果
if [ $? -eq 0 ]; then
echo "[$(date)] 打包成功: $FILENAME"
else
echo "[$(date)] 打包失败!"
exit 1
fi
# 同步到远程
echo "[$(date)] 正在同步到远程家庭主机..."
docker exec rclone rclone copy /data/backup/$FILENAME $RCLONE_REMOTE:$REMOTE_DIR
# 清理 7 天前的旧备份
echo "[$(date)] 清理旧备份..."
find $BACKUP_DIR -name "docker_backup_*.tar.gz" -mtime +7 -exec rm {} \;
echo "[$(date)] 全部完成!"
赋予权限并测试:
chmod +x /opt/backup_docker.sh
/opt/backup_docker.sh
4. 设置定时任务
# 编辑定时任务
crontab -e
# 添加每天 21:00 执行
0 21 * * * /opt/backup_docker.sh
# 修正时区 (可选)
sudo timedatectl set-timezone Asia/Shanghai
5. 灾难恢复流程
当 VPS 损坏或更换服务器时:
# 1. 新 VPS 安装 Docker
curl -fsSL https://get.docker.com | bash
apt install tar
# 2. 上传备份文件到根目录后解压
tar -xzf docker_backup_xxx.tar.gz -C /
# 3. 启动 Dockge
cd /opt/dockge
docker compose up -d
# 4. 在 Dockge 面板中点击 Update 或 Start 恢复所有容器
静态网页托管
核心理念
不需要安装 Nginx 软件,而是用 Nginx Docker 容器托管网页
角色分工:
- Cloudflare Tunnel: 对外大门 (域名、SSL、端口转发)
- Docker Nginx: 内部文件分发
目录结构
/opt/docker_data/nginx_pro/
├── conf/
│ └── default.conf # 核心配置
└── html/ # 网页仓库
├── love/ # 站点1
└── resume/ # 站点2
Nginx 配置 (default.conf)
# 站点 1: Love
server {
listen 80;
server_name love.hxnppll.top;
location / {
root /usr/share/nginx/html/love;
index index.html index.htm;
}
}
# 站点 2: Resume
server {
listen 80;
server_name resume.hxnppll.top;
location / {
root /usr/share/nginx/html/resume;
index index.html index.htm;
}
}
# 默认兜底
server {
listen 80 default_server;
server_name _;
return 404;
}
Dockge 部署
Name: nginx-pro
version: '3.8'
services:
nginx-pro:
image: nginx:alpine
container_name: nginx-pro
restart: always
ports:
- 8037:80
volumes:
- /opt/docker_data/nginx_pro/html:/usr/share/nginx/html
- /opt/docker_data/nginx_pro/conf/default.conf:/etc/nginx/conf.d/default.conf
Cloudflare Tunnel 配置
所有子域名都指向同一端口,让 Nginx 自己分拣:
| Subdomain | Service URL | 说明 |
|---|---|---|
| love | http://nginx-pro:80 | Love 主页 |
| resume | http://nginx-pro:80 | 简历页 |
维护命令
# 修改 HTML 文件: 无需重启,刷新浏览器即可
# 修改 default.conf 后重载配置
docker exec -it nginx-pro nginx -s reload
扩展应用
镜像导入流程 (国内网络限制)
# Windows 下载并打包
docker pull [镜像名]
docker save -o D:\xxx.tar [镜像名]
# 上传到 VPS 后导入
docker load -i /opt/xxx.tar
# Dockge 配置中添加
pull_policy: never # 强制使用本地镜像
1. Homarr (个人仪表盘)
特点: 漂亮的导航页,集成 Docker 容器状态
Windows 下载:
docker pull ghcr.io/ajnart/homarr:latest
docker save -o D:\homarr.tar ghcr.io/ajnart/homarr:latest
VPS 终端:
把 homarr.tar 上传到 VPS 的 /opt。
docker load -i /opt/homarr.tar
Dockge 配置:
services:
homarr:
image: ghcr.io/ajnart/homarr:latest
pull_policy: never
container_name: homarr
volumes:
- /opt/docker_data/homarr/configs:/app/data/configs
- /opt/docker_data/homarr/icons:/app/public/icons
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 7575:7575
restart: unless-stopped
- Cloudflare:
home->localhost:7575 - 玩法:以后浏览器主页就设成
https://home.hxnppll.top,一站式直达所有服务。
2. Linkding (书签管理)
特点: 极简书签服务,支持标签和稍后阅读
Windows 下载:
docker pull sissbruecker/linkding:latest
docker save -o D:\linkding.tar sissbruecker/linkding:latest
VPS 终端:
把 linkding.tar 上传到 VPS 的 /opt。
docker load -i /opt/linkding.tar
Dockge 配置:
services:
linkding:
image: sissbruecker/linkding:latest
pull_policy: never
container_name: linkding
volumes:
- /opt/docker_data/linkding:/etc/linkding/data
ports:
- 9090:9090
restart: unless-stopped
Cloudflare: mark -> localhost:9090
访问: mark.hxnppll.top
3. Excalidraw (在线画图 可多人同步协作)
概述:
- 功能:手绘风格白板工具,支持多人实时协作。
- 架构:前端 (绘图界面) + 后端 (Room 协作服务)。
- 局限:开源版默认不带数据库存储,刷新后数据丢失,需手动保存
.excalidraw文件到本地。
第一步:获取源码 (在 Windows 本地)
你需要先有 git 环境,或者直接去 GitHub 下载 ZIP 包。
克隆仓库: 打开 gitbash:
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
git clone https://github.com/excalidraw/excalidraw.git
cd excalidraw
第二步:修改配置文件 (最关键的一步)
在项目根目录下,修改 .env.production为:
文件内容 (.env.production):
# 1. 生产模式
MODE="production"
NODE_ENV="production"
# 2. 你的后端协作地址 (WebSocket) - 必须填对
# 这是实现“看着别人画”的关键
VITE_APP_WS_SERVER_URL=wss://draw-room.hxnppll.top
# 3. 存储后端 (HTTP)
# 虽然 excalidraw-room 镜像存不了文件,但填上你自己的地址
# 可以防止前端去请求官方服务器报错跨域
VITE_APP_BACKEND_V2_GET_URL=https://draw-room.hxnppll.top/api/v2/room
VITE_APP_BACKEND_V2_POST_URL=https://draw-room.hxnppll.top/api/v2/room
# 4. 禁用 Firebase (彻底切断 Google 依赖)
VITE_APP_FIREBASE_CONFIG=
# 5. 其他杂项 (保持默认或关闭)
VITE_APP_ENABLE_TRACKING=false
VITE_APP_ENABLE_SENTRY=false
注意: 必须使用 VITE_ 开头,Excalidraw 现已全面迁移到 Vite 构建工具。
域名替换成你自己的将要设置的
第三步:构建 Docker 镜像
Excalidraw 根目录自带了 Dockerfile,我们直接用它构建。
在 excalidraw 文件夹下执行:
# -t 后面是你给镜像起的名字,点(.)代表当前目录
docker build -t my-excalidraw:latest .
提示:这一步会比较慢(大约 5-10 分钟),因为它需要下载 Node.js 依赖并进行编译(Nginx + 静态资源打包)。请耐心等待直到出现 Successfully tagged my-excalidraw:latest。
第四步:导出并上传到 VPS
构建完成后,这个镜像现在只存在于 Windows 电脑上。需要把它搬运到 VPS。
另外,后端也需要拉取,由于网络原因,建议在本地下载好镜像后上传至 VPS。
1. Windows 终端 (PowerShell)
# --- 1. 导出前端 ---
docker save -o D:\my-excalidraw.tar my-excalidraw:latest
# --- 2. 下载并导出后端 (协作服务) ---
docker pull excalidraw/excalidraw-room:latest
docker save -o D:\draw-room.tar excalidraw/excalidraw-room:latest
2. VPS 终端 (SSH) 将 D:\my-excalidraw.tar 和 D:\draw-room.tar 上传到 VPS 的 /opt 目录,然后导入:
docker load -i /opt/my-excalidraw.tar
docker load -i /opt/draw-room.tar
第五步:Dockge 配置
version: '3.8'
services:
# --- 1. 你的专属前端 ---
excalidraw-frontend:
# 必须填你刚才构建的名字
image: my-excalidraw:latest
#告诉 Docker 不要去网上拉,只用本地导入的这个
pull_policy: never
container_name: excalidraw-web
restart: unless-stopped
ports:
# 左边是 VPS 端口,可以根据需要修改,比如 5002
- 5002:80
depends_on:
- excalidraw-room
# --- 2. 协作后端 (不需要自己构建,用官方的即可) ---
excalidraw-room:
image: excalidraw/excalidraw-room:latest
# 后端我们也导入了,也设置 never 防止它去网上乱拉
pull_policy: never
container_name: excalidraw-room
restart: unless-stopped
ports:
# 左边是 VPS 端口,对应 Nginx 反代的目标端口
- 5003:80
environment:
- ALLOWED_ORIGINS=*
点击 Deploy。
第六步:配置 Cloudflare (两个域名)
需要两个子域名,一个给界面看,一个给协作数据走。
-
界面域名 (
draw.hxnppll.top):- Subdomain:
draw - URL:
localhost:5002
- Subdomain:
-
后端域名 (
draw-room.hxnppll.top)- Subdomain:
draw-room - URL:
localhost:5003
- Subdomain:
第七步:测试协作
- 用浏览器打开
https://draw.hxnppll.top。 - 点击左上角的“协作”按钮(两个人头图标)。
- 点击“开始会话”。
- 如果没有报错,且生成了一个链接,说明连接后端成功!
- 把链接发给手机或者另一个浏览器,试试能不能看到对方的鼠标移动。
4. Stirling-PDF (PDF 工具箱)
特点: 支持合并、拆分、转 Word、OCR 等
Windows 下载:
docker pull frooodle/s-pdf:latest
docker save -o D:\spdf.tar frooodle/s-pdf:latest
VPS 导入:
把 spdf.tar 上传到 VPS 的 /opt。
docker load -i /opt/spdf.tar
Dockge 配置:
services:
stirling-pdf:
image: frooodle/s-pdf:latest
pull_policy: never
ports:
- 8087:8080
environment:
- DOCKER_ENABLE_SECURITY=false
restart: unless-stopped
Cloudflare: pdf -> localhost:8087
访问: pdf.hxnppll.top
5. IT-Tools (开发工具集)
Windows 下载:
docker pull corentinth/it-tools:latest
docker save -o D:\it-tools.tar corentinth/it-tools:latest
VPS 导入:
把 it-tools.tar 上传到 VPS 的 /opt。
# 导入 IT-Tools
docker load -i /opt/it-tools.tar
Dockge 配置:
services:
it-tools:
image: corentinth/it-tools:latest
pull_policy: never
container_name: it-tools
restart: unless-stopped
ports:
- 8085:80
Cloudflare: tools-> localhost:8085
访问: tools.hxnppll.top
6. Pingvin Share (文件分享)
Windows 下载:
docker pull stonith404/pingvin-share:latest
docker save -o D:\pingvin.tar stonith404/pingvin-share:latest
VPS 导入:
把 pingvin.tar 上传到 VPS 的 /opt。
# 导入 Pingvin Share
docker load -i /opt/pingvin.tar
Dockge 配置:
services:
pingvin-share:
image: stonith404/pingvin-share:latest
pull_policy: never
restart: unless-stopped
ports:
- 3000:3000
volumes:
- /opt/docker_data/pingvin/data:/opt/app/backend/data
- /opt/docker_data/pingvin/images:/opt/app/frontend/public/img
Cloudflare: share-> localhost:3000
访问: share.hxnppll.top
7. VoceChat (私人聊天室)
特点: 超轻量,支持文字、图片、文件、语音
Windows 下载:
docker pull privoce/vocechat-server:latest
docker save -o D:\vocechat.tar privoce/vocechat-server:latest
VPS 导入:
把 vocechat.tar 上传到 VPS 的 /opt。
docker load -i /opt/vocechat.tar
Dockge 配置:
services:
vocechat:
image: privoce/vocechat-server:latest
pull_policy: never
container_name: vocechat
ports:
- 3009:3000
volumes:
- /opt/docker_data/vocechat:/home/vocechat-server/data
restart: unless-stopped
Cloudflare: chat-> localhost:3009
访问: chat.hxnppll.top
8. MicroBin (极简剪贴板)
Windows 下载:
docker pull danielszabo99/microbin:latest
docker save -o D:\microbin.tar danielszabo99/microbin:latest
VPS 导入:
把 microbin.tar 上传到 VPS 的 /opt。
docker load -i /opt/microbin.tar
Dockge 配置:
services:
microbin:
image: danielszabo99/microbin:latest
pull_policy: never
container_name: microbin
ports:
- 8086:8080
volumes:
- /opt/docker_data/microbin:/app/microbin_data
restart: unless-stopped
Cloudflare: paste -> localhost:8086
访问: paste.hxnppll.top
9. EasyImage (简单图床)
特点: 轻量、无需数据库、支持 WebP 转换
Windows 下载:
# 1. 拉取镜像
docker pull ddsderek/easyimage:latest
# 2. 导出
docker save -o D:\easyimage.tar ddsderek/easyimage:latest
VPS 导入:
把 easyimage.tar 上传到 VPS 的 /opt。
docker load -i /opt/easyimage.tar
Dockge 配置:
version: '3.3'
services:
easyimage:
image: ddsderek/easyimage:latest
pull_policy: never
container_name: easyimage
ports:
- 8091:80
environment:
- TZ=Asia/Shanghai
- PUID=0
- PGID=0
volumes:
- /opt/docker_data/easyimage/config:/app/web/config
- /opt/docker_data/easyimage/i:/app/web/i
restart: unless-stopped
Cloudflare: img-> localhost:8091
访问: img.hxnppll.top
10.Navidrome (音乐流媒体服务器)
用途: 自建音乐库,支持 Subsonic/Airsonic API
Windows 下载:
docker pull deluan/navidrome:latest
docker save -o D:\navidrome.tar deluan/navidrome:latest
VPS 导入:
把 navidrome.tar 上传到 VPS 的 /opt。
docker load -i /opt/navidrome.tar
Dockge 配置:
services:
navidrome:
image: deluan/navidrome:latest
pull_policy: never
container_name: navidrome
ports:
- 4533:4533
volumes:
- /opt/docker_data/navidrome:/data
# 需要挂载你的音乐目录
environment:
- ND_LOGLEVEL=info
restart: unless-stopped
Cloudflare: music.hxnppll.top → localhost:4533
11.Vaultwarden (密码管理器)
用途: Bitwarden 的轻量级替代,全平台密码同步
Windows 下载:
docker pull vaultwarden/server:latest
docker save -o D:\vaultwarden.tar vaultwarden/server:latest
VPS 导入:
把 vaultwarden.tar 上传到 VPS 的 /opt。
docker load -i /opt/vaultwarden.tar
Dockge 配置:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
# 强制使用默认网桥,不创建新网络,节省 IP 资源
network_mode: bridge
ports:
- 8098:80
volumes:
- /opt/docker_data/vaultwarden:/data
environment:
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=true
Cloudflare: password.hxnppll.top → localhost:8080
重要: 注册完账号后建议关闭注册(SIGNUPS_ALLOWED=false)
12.ChatGPT-Next-Web (AI 聊天 UI)
- 作用: 一个漂亮的网页版 ChatGPT 客户端。
- 优势: 只需要填 Key,数据存在浏览器本地,支持预设面具(翻译官、润色师),支持多端同步。
- 架构特点: 针对 NAT VPS 网络环境优化,使用 Host 模式 + 优化 API 线路。
Windows 下载:
# 拉取镜像
docker pull yidadaa/chatgpt-next-web:latest
# 导出为 tar 包
docker save -o D:\chatgpt-next-web.tar yidadaa/chatgpt-next-web:latest
VPS 导入:
把 chatgpt-next-web.tar 上传到 VPS 的 /opt。
# 导入 ChatGPT 镜像
docker load -i /opt/chatgpt-next-web.tar
部署配置 (Dockge):
network_mode: host: 解决容器在 NAT VPS 无法连接外网的问题。HOSTNAME=0.0.0.0: 解决 Ubuntu 系统下 Host 模式监听 IP 异常导致 Cloudflare 连不上的问题。BASE_URL: 更换为apic1.ohmycdn.com,解决 VPS IP 被 API 服务商阻断/超时的问题。
version: "3.9"
services:
chatgpt-next-web:
image: yidadaa/chatgpt-next-web:latest
container_name: chatgpt-next-web
pull_policy: never
# 使用 host 模式,解决网络连通性问题
network_mode: host
environment:
- HOSTNAME=0.0.0.0
- OPENAI_API_KEY=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
- CODE=zw200495
# 去掉结尾的 /v1,防止出现双重 /v1/v1 路径
- BASE_URL=https://apic1.ohmycdn.com
- CUSTOM_MODELS=-all,+gpt-5.2,+claude-opus-4-5,+claude-haiku-4-5,+claude-sonnet-4-5,+grok-4-fast,+gemini-3-pro-preview
- DEFAULT_MODEL=gpt-5.2
# 因为用了 host 模式,默认是 3000。如果需要改为 3030,必须用环境变量
- PORT=3030
restart: always
networks: {}
Cloudflare: ai.hxnppll.top → localhost:3030
URL: localhost:3030
- 注:这里填 localhost 或 127.0.0.1 均可,因为 docker 已配置监听 0.0.0.0。
访问: ai.hxnppll.top
跑通了 但意义不大 国内的vps通常网络限制很严 不稳定 还不如网页或客户端使用
13.Dozzle (实时日志查看器)
- 痛点: 每次看日志都要
docker logs -f xxx,很麻烦。 - 作用: 一个网页,实时展示所有容器的日志,支持搜索、过滤、下载。
Windows 下载:
# 拉取镜像
docker pull amir20/dozzle:latest
# 导出为 tar 包
docker save -o D:\dozzle.tar amir20/dozzle:latest
VPS 导入:
把 dozzle.tar 上传到 VPS 的 /opt。
# 导入 Dozzle 镜像
docker load -i /opt/dozzle.tar
部署配置 (Dockge):
version: "3"
services:
dozzle:
container_name: dozzle
image: amir20/dozzle:latest
# 关键:强制使用本地导入的镜像
pull_policy: never
volumes:
# 必须挂载 docker.sock 才能读取日志
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 8888:8080
restart: unless-stopped
network_mode: bridge
environment:
# 设置登录账号密码,保护日志安全
- DOZZLE_AUTH_USERNAME=wei
- DOZZLE_AUTH_PASSWORD=zw200495
networks: {}
Cloudflare: log.hxnppll.top → localhost:8888
访问: log.hxnppll.top
系统维护增强 (防爆盘配置)
这步非常重要,我们需要修改 Docker 的配置文件。由于你之前可能已经配过镜像源,我们需要小心地合并配置。
1. 修改 daemon.json
在 VPS 终端执行编辑命令:
nano /etc/docker/daemon.json
将文件内容修改为以下格式(注意 JSON 格式,逗号不能少):
{
"registry-mirrors": [
"https://docker.1panel.dev",
"https://docker.fxxk.dedyn.io",
"https://docker.vhx.cloud",
"https://registry.dockermirror.com",
"https://docker.1panel.live",
"https://docker.m.daocloud.io",
"https://huecker.io"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
解释:这表示保留之前的镜像加速,同时限制每个容器的日志文件最大 10MB,最多保留 3 个文件(即每个容器最多占用 30MB 空间)。
保存退出:按 Ctrl+O -> Enter -> Ctrl+X。
2. 重启 Docker 生效
注意:重启 Docker 会导致所有容器短暂离线。
systemctl daemon-reload
systemctl restart docker
3. 设置定时清理任务
编辑定时任务:
crontab -e
在文件末尾添加一行(每周日凌晨3点清理无用的镜像、缓存和停止的容器):
0 3 * * 0 docker system prune -af --volumes > /dev/null 2>&1
服务汇总表
VPS 服务 (10.10.10.1)
| 域名 | 端口 | 服务 | 作用 |
|---|---|---|---|
| docker.hxnppll.top | 5001 | Dockge | 容器管理 |
| file.hxnppll.top | 8081 | FileBrowser | 文件管理 |
| status.hxnppll.top | 3001 | Uptime Kuma | 系统监控 |
| rclone.hxnppll.top | 5572 | Rclone Web | 备份管理 |
| home.hxnppll.top | 7575 | Homarr | 个人仪表盘 |
| draw.hxnppll.top | 5002 | Excalidraw | 在线画图 |
| draw-room.hxnppll.top | 5003 | Excalidraw-room | 实时协作服务器 |
| pdf.hxnppll.top | 8087 | Stirling-PDF | PDF 工具 |
| tools.hxnppll.top | 8085 | IT-Tools | 开发工具 |
| share.hxnppll.top | 3000 | Pingvin | 文件分享 |
| chat.hxnppll.top | 3009 | VoceChat | 私人聊天 |
| paste.hxnppll.top | 8086 | MicroBin | 剪贴板 |
| img.hxnppll.top | 8091 | EasyImage | 图床 |
| mark.hxnppll.top | 9090 | Linkding | 书签 |
| music.hxnppll.top | 4533 | Navidrome | 音乐管理 |
| password.hxnppll.top | 8098 | Vaultwarden | 密码管理 |
| ai.hxnppll.top | 3030 | ChatGPT-Next-Web | 网页AI |
| log.hxnppll.top | 8888 | Dozzle | 日志管理 |
| love.hxnppll.top | 8037 | Nginx | Love 主页 |
| resume.hxnppll.top | 8037 | Nginx | 简历页 |
家庭主机服务 (10.10.10.2)
| 域名 | 端口 | 服务 | 作用 |
|---|---|---|---|
| note.hxnppll.top | 37840 | Trilium | 笔记系统 |
| alist.hxnppll.top | 5244 | Alist | 文件列表 |
| vue.hxnppll.top | 5173 | Vue Dev | 开发环境 |
其他主机服务 (10.10.10.3)
| 域名 | 端口 | 服务 | 作用 |
|---|---|---|---|
| xinnian.hxnppll.top | 37840 | Trilium | 笔记分享 |
安全建议
Cloudflare Access (双重保护)
对敏感服务 (Dockge, FileBrowser) 建议启用:
- Cloudflare Dash → Zero Trust → Access → Applications
- Add application → Self-hosted
- Application domain:
docker.hxnppll.top - Identity providers: One-time PIN
- Policy:
- Action: Allow
- Include: Emails → [你的邮箱]
效果: 即使密码泄露,没有邮箱验证码也无法访问
总结
这套方案的核心优势:
- ✅ 全 Docker 化: 环境干净,迁移方便
- ✅ 自动备份: 数据安全有保障
- ✅ Cloudflare 加持: 免费 SSL,高可用
- ✅ 资源高效: 4GB 内存跑 10+ 服务绰绰有余
- ✅ 易于维护: 可视化管理,小白友好
记住三个核心原则:
- 数据挂载: 所有容器数据都要挂载到宿主机
- 定时备份: 每天自动备份到云盘
- 避免高带宽: NAT VPS 不适合跑影视库和下载器


💬 评论